package br.com.agenda.server.servidor;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

import br.com.agenda.negocio.entity.Convite;
import br.com.agenda.negocio.entity.IAgenda;
import br.com.agenda.negocio.entity.IConvite;
import br.com.agenda.negocio.entity.IEvento;
import br.com.agenda.negocio.entity.IUsuario;

public class ServicoServidor<T> extends UnicastRemoteObject implements IServicoServidor<T>{
    

    /**
	 * 
	 */
	private static final long serialVersionUID = 2748365552451167888L;
	private List<IAgenda> agendas = new ArrayList<IAgenda>();
	private List<IUsuario> usuarios = new ArrayList<IUsuario>();

	public ServicoServidor() throws RemoteException{
       
    }
	
	@Override
	public IAgenda localizarAgenda(String nomeUsuario) throws RemoteException {
		for(IAgenda a: agendas)
			if(a.getUsuario().getNome().equals(nomeUsuario)) return a; 
		return null;	
	}

	
	@Override
	public void adicionaAgenda(IAgenda agenda) throws RemoteException{
		this.agendas.add(agenda);
		System.out.println(agendas.get(0).getUsuario().getNome());
		System.out.println("Agenda Adicionada");
		
	}
	
	@Override
	public void adicionaUsuario(IUsuario usuario) throws RemoteException{
		this.usuarios.add(usuario);
		System.out.println("Usuario Adicionado");
		
	}
	
	@Override
	public List<IUsuario> getUsuarios() throws RemoteException {
		return usuarios;
	}
	
	@Override
	public List<IUsuario> getContatos(String propietario) throws RemoteException {
		for (IAgenda agenda : agendas) {
			if (agenda.getUsuario().getNome().equalsIgnoreCase(propietario)) return agenda.getContatos();
		}
		return null;
	}

	@Override
	public boolean existeContato(String contato) throws RemoteException {
		return (getContato(contato) != null);
		
	}

	public IUsuario getContato(String contato) throws RemoteException{
		for (IAgenda agenda : agendas) {
			if (agenda.getUsuario().getNome().equalsIgnoreCase(contato)) return agenda.getUsuario();
		}
		return null;
	}

	@Override
	public void enviarConvites(IEvento evento) throws RemoteException {
		
		IConvite convite = new Convite(evento.getParticipantes().get(0), evento.getData(), evento.getNomeEvento());
		
		for (int i = 1; i < evento.getParticipantes().size();i++) {
			boolean dataOcupada = false;
			IUsuario usuario = evento.getParticipantes().get(i); 
			IAgenda agenda = localizarAgenda(usuario.getNome());
			for(IEvento eve : agenda.getEventos()){
				
				if(mesmaData(evento.getData(),eve.getData())){
					dataOcupada = true;
				}
			}
			if (!dataOcupada) agenda.getUsuario().setConvites(convite);
		}
		
	}
	
	private boolean mesmaData(Calendar cal1, Calendar cal2){
		long umaHora = 1000*60*60;
		
		if (cal1.equals(cal2)){
			return false;
		
		}else return true;
	}
	

	@Override
	public void respostaConvite(IUsuario usuario, IConvite convite, boolean conviteConfirmado) throws RemoteException {
		IUsuario usuarioRemetente = convite.getRemetente();
		IAgenda agenda = localizarAgenda(usuarioRemetente.getNome());
		IEvento evento = agenda.localizarEventoPendentes(convite.getNomeDoEvento());
		
		
		if(!conviteConfirmado){
			for (int i = 0; i < evento.getParticipantes().size(); i ++) {
				if(evento.getParticipantes().get(i).getNome().equals(usuario.getNome())){
					evento.getParticipantes().remove(i);
					
				}
				
			}
		}
			
		evento.setParticipantesPendentes(evento.getParticipantesPendentes() - 1);
		if(evento.getParticipantesPendentes() <= 0){
			agenda.setEventosAguardandoConfirmacao(evento);
		}
		
	}

	@Override
	public void marcarEventoNosContatos(IEvento evento) throws RemoteException {
		List<IUsuario> usuarios = evento.getParticipantes();
		for(int i = 1; i < usuarios.size(); i++){
			IAgenda agenda = localizarAgenda(usuarios.get(i).getNome()); 
			agenda.adicionarEvento(evento);
		}
	}
	
}	
    
